﻿//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//    Crolengi, this program (a part of program) is gameengine based on C++\Directx
//    Copyright (C) 2008 Pashinin Anton Alekseevich (Crol)
//
//    This program is free software: you can redistribute it and/or modify
//    it under the terms of the GNU General Public License as published by
//    the Free Software Foundation, either version 3 of the License, or
//    (at your option) any later version.
//
//    This program is distributed in the hope that it will be useful,
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//    GNU General Public License for more details.
//
//    You should have received a copy of the GNU General Public License
//    along with this program.  If not, see <http://www.gnu.org/licenses/>.
//    (INCLUDING NEGLIGENCE OR OTHERWISE) 
//    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
//    EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
//    Contacts: 
//    Mail: crolengi@gmail.com
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


#pragma once
#ifndef  defines01_h
#define  defines01_h


#ifndef SAFE_DELETE
#define SAFE_DELETE(p)       { if (p!=NULL) { delete (*p);     (p)=NULL; } }
#endif    

#ifndef SAFE_DELETE_ARRAY
#define SAFE_DELETE_ARRAY(p) { if (p!=NULL) { delete[] (*p);   (p)=NULL; } }
#endif    

#ifndef SAFE_RELEASE
#define SAFE_RELEASE(p)      { if (p!=NULL) { (*p)->Release(); (p)=NULL; } }
#endif

#ifndef SAFE_RELEASE_P
#define SAFE_RELEASE_P(p)     { if (p!=NULL) { (*p).Release(); (p)=NULL; } }
#endif
/////////////////////////////////////////////////////////////////////////
//Функция для получения луча направленного из точки положения курсора
//для последующего выделения объектов под ним
//частично код взят из примера Pick (DX SDK)
/////////////////////////////////////////////////////////////////////////
void GetCurRay(HWND       *hwnd, // хэндлер окна
			   D3DXMATRIX matWorld, // мировая матрица
               D3DXMATRIX matView,  // матрица вида              
			   D3DXMATRIX matProj,  // матрица проекции
			   short int rezW, // текущее разрешение окна
			   short int rezH,

               // выходные параметры
               D3DXVECTOR3 *vPickRayDir,  // направление луча
               D3DXVECTOR3 *vPickRayOrig )// начало луча
{

		POINT ptCursor;
        GetCursorPos( &ptCursor ); //получаем текущие координаты курсора 

        ScreenToClient(*hwnd, &ptCursor ); // корректируем координаты с учетом расположения окна

        // Compute the vector of the pick ray in screen space
		// вычисляем вектор направления нашего щелчка с учетом матрицы проекции
        D3DXVECTOR3 v;
        v.x =  ( ( ( 2.0f * ptCursor.x ) / rezW ) - 1 ) / matProj._11;
        v.y = -( ( ( 2.0f * ptCursor.y ) / rezH ) - 1 ) / matProj._22;
        v.z =  1.0f;

        // Get the inverse view matrix
		// получаем инвертированную видовую матрицу
        D3DXMATRIX mWorldView = matWorld * matView;
        D3DXMATRIX m;
        D3DXMatrixInverse( &m, NULL, &mWorldView );

        // Transform the screen space pick ray into 3D space
		// трансформируем координату щелчка мыши и направление в трехмерное пространство
        vPickRayDir->x  = v.x*m._11 + v.y*m._21 + v.z*m._31;
        vPickRayDir->y  = v.x*m._12 + v.y*m._22 + v.z*m._32;
        vPickRayDir->z  = v.x*m._13 + v.y*m._23 + v.z*m._33;
        vPickRayOrig->x = m._41;
        vPickRayOrig->y = m._42;
        vPickRayOrig->z = m._43;
}





#endif 